package com.example.werewolf.todo;

import lombok.Data;

import java.time.Instant;

/**
 * 私有消息模型
 * 代表一条需要私下发送给特定玩家的信息。
 * 通常由 GameEngine 生成，并发送给目标 AIPlayerAgent。
 */
@Data
public class PrivateMessage {

    /**
     * 消息的唯一ID (可选，用于追踪和去重)
     */
    private final String messageId;

    /**
     * 接收此消息的玩家ID
     */
    private final String recipientId;

    /**
     * 消息类型 (用于区分不同种类的私信)
     */
    public enum MessageType {
        /**
         * 夜晚被袭击通知 (发送给被刀玩家，如果女巫没救)
         */
        NIGHT_KILL("你昨晚被狼人袭击了。"),
        /**
         * 女巫救人通知 (发送给被救玩家)
         */
        WITCH_SAVED("你昨晚被女巫救了。"),
        /**
         * 预言家查验结果 (发送给预言家)
         */
        SEER_CHECK_RESULT("你查验的玩家身份是："),
        /**
         * 女巫毒人结果 (发送给女巫，确认毒杀成功)
         */
        WITCH_POISON_SUCCESS("你成功毒杀了目标玩家。"),
        /**
         * 猎人开枪结果 (发送给猎人，确认开枪成功)
         */
        HUNTER_SHOOT_SUCCESS("你成功开枪带走了目标玩家。"),
        /**
         * 狼人队友信息 (发送给狼人，告知其队友是谁)
         */
        WEREWOLF_ALLY_INFO("你的狼人队友是：");

        private final String description;

        MessageType(String description) {
            this.description = description;
        }

        public String getDescription() {
            return description;
        }
    }

    private final MessageType type;

    /**
     * 消息的具体内容
     * 对于查验结果，内容可能是 "好人" 或 "狼人"。
     * 对于狼人队友信息，内容可能是 "3号"。
     */
    private final String content;

    /**
     * 消息生成的时间戳
     */
    private final Instant timestamp;

    // ========== 构造函数 ==========

    public PrivateMessage(String recipientId, MessageType type, String content) {
        this.messageId = java.util.UUID.randomUUID().toString();
        this.recipientId = recipientId;
        this.type = type;
        this.content = content;
        this.timestamp = Instant.now();
    }

    // ========== Getter 方法 ==========

    public String getMessageId() {
        return messageId;
    }

    public String getRecipientId() {
        return recipientId;
    }

    public MessageType getType() {
        return type;
    }

    public String getContent() {
        return content;
    }

    public Instant getTimestamp() {
        return timestamp;
    }

    // ========== 重写 toString 方法，方便调试 ==========

    @Override
    public String toString() {
        return "PrivateMessage{" +
                "recipientId='" + recipientId + '\'' +
                ", type=" + type +
                ", content='" + content + '\'' +
                ", timestamp=" + timestamp +
                '}';
    }
}
